home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / look.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  4KB  |  165 lines

  1. /*  look - look up words in the dictionary    Author: Terrence W. Holm */
  2.  
  3.  
  4. /*  look  [ -f ]  prefix[/suffix]  [ dictionary ]
  5.  *
  6.  *  Looks for all words in the on-line dictionary
  7.  *  beginning with the specified <prefix> and ending
  8.  *  with <suffix>.
  9.  *
  10.  *  Fold to lower case if "-f" given. Use the file
  11.  *  "dictionary" or /usr/lib/dictionary.
  12.  *
  13.  ******************************************************
  14.  *
  15.  *  This command was written for MINIX, and is slightly
  16.  *  different than the UNIX look(1). First of all, the
  17.  *  list of words is in a different place. Second, these
  18.  *  words are not sorted by -df. And finally, the
  19.  *  ``suffix'' option was added to limit the output of
  20.  *  the multiple variations of each word as contained
  21.  *  in the MINIX dictionary.
  22.  */
  23.  
  24. #include <ctype.h>
  25. #include <sys/types.h>
  26. #include <string.h>
  27. #include <unistd.h>
  28. #include <stdio.h>
  29.  
  30. #ifdef UNIX
  31. #define  WORDS   "/usr/dict/words"
  32. #else
  33. #define  WORDS   "/usr/lib/dictionary"
  34. #endif
  35.  
  36. #define  MAX_WORD_LENGTH   80    /* including '\0'  */
  37.  
  38.  
  39. main(argc, argv)
  40. int argc;
  41. char *argv[];
  42.  
  43. {
  44.   int fold = 0;
  45.   char *prefix;
  46.   char *suffix;
  47.   char *word_file = WORDS;
  48.  
  49.   FILE *words;
  50.   long head = 0;
  51.   long tail;
  52.   long mid_point;
  53.   char word[MAX_WORD_LENGTH];
  54.   char unfolded_word[MAX_WORD_LENGTH];
  55.   int cmp;
  56.  
  57.  
  58.   /* Check the arguments: fold, prefix, suffix and word_file.  */
  59.  
  60.   if (argc > 1 && strcmp(argv[1], "-f") == 0) {
  61.     fold = 1;
  62.     --argc;
  63.     ++argv;
  64.   }
  65.   if (argc < 2 || argc > 3) {
  66.     fprintf(stderr, "Usage: %s [-f] prefix[/suffix] [dictionary]\n", argv[0]);
  67.     exit(1);
  68.   }
  69.   prefix = argv[1];
  70.  
  71.   if ((suffix = strchr(prefix, '/')) == NULL)
  72.     suffix = "";
  73.   else
  74.     *suffix++ = '\0';
  75.  
  76.   if (fold) {
  77.     Fold(prefix);
  78.     Fold(suffix);
  79.   }
  80.   if (argc == 3) word_file = argv[2];
  81.  
  82.  
  83.   /* Open the word file, and find how big it is.  */
  84.   if ((words = fopen(word_file, "r")) == NULL) File_Error(word_file);
  85.   if (fseek(words, 0L, SEEK_END) != 0) File_Error(word_file);
  86.   tail = ftell(words);
  87.  
  88.   /* Use a binary search on the word file to find a 512 byte     */
  89.   /* Window containing the first word starting with "prefix".     */
  90.   while (head + 512 < tail) {
  91.     mid_point = (head + tail) / 2;
  92.     if (fseek(words, mid_point, SEEK_SET) != 0) File_Error(word_file);
  93.  
  94.     /* Skip the partial word we seeked into.  */
  95.     fgets(word, MAX_WORD_LENGTH, words);
  96.     if (fgets(word, MAX_WORD_LENGTH, words) == NULL)
  97.         File_Error(word_file);
  98.     word[strlen(word) - 1] = '\0';    /* remove \n  */
  99.     strcpy(unfolded_word, word);
  100.     if (fold) Fold(word);
  101.     cmp = strcmp(prefix, word);
  102.     if (cmp == 0) {
  103.         printf("%s\n", unfolded_word);
  104.         head = ftell(words);
  105.         break;
  106.     }
  107.     if (cmp < 0)
  108.         tail = mid_point;
  109.     else
  110.         head = ftell(words);
  111.   }
  112.  
  113.   fseek(words, head, SEEK_SET);
  114.  
  115.  
  116.  
  117.   {
  118.     /* Print out all the words starting with "prefix".  */
  119.  
  120.     int prefix_length = strlen(prefix);
  121.     int suffix_length = strlen(suffix);
  122.     int word_length;
  123.  
  124.  
  125.     while (fgets(word, MAX_WORD_LENGTH, words) != NULL) {
  126.         word_length = strlen(word) - 1;
  127.         word[word_length] = '\0';    /* remove \n  */
  128.         strcpy(unfolded_word, word);
  129.         if (fold) Fold(word);
  130.         cmp = strncmp(prefix, word, prefix_length);
  131.         if (cmp < 0) break;
  132.         if (cmp == 0)
  133.             if (suffix_length == 0 || word_length >= suffix_length
  134.                 && strcmp(suffix, word + word_length - suffix_length) == 0)
  135.                 printf("%s\n", unfolded_word);
  136.     }
  137.   }
  138.  
  139.   fclose(words);
  140.  
  141.   exit(0);
  142. }
  143.  
  144.  
  145.  
  146. Fold(str)
  147. char *str;
  148.  
  149. {
  150.   while (*str) {
  151.     if (isupper(*str)) *str = *str - 'A' + 'a';
  152.     str++;
  153.   }
  154. }
  155.  
  156.  
  157.  
  158. File_Error(word_file)
  159. char *word_file;
  160.  
  161. {
  162.   perror(word_file);
  163.   exit(1);
  164. }
  165.